package com.t.bricks.bussiness.controller.guest;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.t.bricks.bussiness.component.guest.GuestLoginLogServiceAspect;
import com.t.bricks.bussiness.service.guest.GuestService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.spring.ModuleUtil;

@RestController
@Api(value="业务账户通用操作", tags={"基本系统-业务账户通用操作接口"})
@RequestMapping("/guest/")
public class GuestController {
	
	@Autowired
	private GuestService guestService;

	/**
	 * 修改当前账户密码
	 * @param sDbAndTable 数据库与表名称(dbName.tableName)
	 * @param sOldPass
	 * @param sNewPass
	 * @return
	 */
	//[start]
	@ApiOperation(value="修改当前账户密码", notes="只有当前账户才能修改密码,且必须提供当前密码")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sDbAndTable", value="归属来源(库名.表名)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sOldPass", value="旧密码", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="sNewPass", value="新密码", dataType="Integer", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="无法获取当前账户信息"),
		@ApiResponse(code=8002, message="旧密码参数为空"),
		@ApiResponse(code=8003, message="新密码参数为空"),
		@ApiResponse(code=8004, message="没有查找到当前账户"),
		@ApiResponse(code=8005, message="没有查找到对应账户信息"),
		@ApiResponse(code=8006, message="账户被限制"),
		@ApiResponse(code=8007, message="提供的旧密码错误"),
		@ApiResponse(code=8999, message="密码无需修改"),
		@ApiResponse(code=7001, message="预期的修改未成功"),
		@ApiResponse(code=7002, message="修改时发生异常"),
		@ApiResponse(code=7003, message="7003~7998为修改时发生的其它错误"),
		@ApiResponse(code=7999, message="密码修改成功")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/password/edit")
	public MsgEmity editPass(String sDbAndTable, String sOldPass, String sNewPass) {
		String currentGuestId = ModuleUtil.currentLoginUserId();//取当前登录账号(可能是LonginUser也可能是guest系列)
		return guestService.editPass(sDbAndTable, currentGuestId, sOldPass, sNewPass);
	}

	/**
	 * 重置密码
	 * @param sDbAndTable 数据库与表名称(dbName.tableName)
	 * @param sId 待重置密码的账号
	 * @param sPass 当前操作账户的密码
	 * @return
	 */
	//[start]
	@ApiOperation(value="重置密码", notes="只有当前账户和管理员(admin)才能重置密码")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sDbAndTable", value="归属来源(库名.表名)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sId", value="表编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sPass", value="新密码", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="账户编号为空"),
		@ApiResponse(code=8002, message="未能获取操作人员信息"),
		@ApiResponse(code=8003, message="仅允许管理员或该账号账户重置密码"),
		@ApiResponse(code=8004, message="当前操作账户信息错误"),
		@ApiResponse(code=8005, message="提供的操作账户密码错误"),
		@ApiResponse(code=8006, message="没有查找到待重置密码的账户"),
		@ApiResponse(code=8999, message="密码无需修改重置"),
		@ApiResponse(code=7001, message="预期的修改未成功"),
		@ApiResponse(code=7002, message="修改时发生异常"),
		@ApiResponse(code=7003, message="7003~7998为修改时发生的其它错误"),
		@ApiResponse(code=7999, message="密码修改成功")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/password/reset")
	public MsgEmity resetPass(String sDbAndTable, String sId, String sPass) {
		return guestService.resetPass(sDbAndTable, sId, sPass);//重置密码
	}

	/**
	 * 根据账户编号设置账户类型
	 * @param sDbAndTable 数据库与表名称(dbName.tableName)
	 * @param sId 账户编号
	 * @param sType 账户类型
	 * @return
	 */
	//[start]
	@ApiOperation(value="根据账户编号设置账户类型")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sDbAndTable", value="归属来源(库名.表名)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sId", value="表编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sType", value="新类型", dataType="Integer", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="账户编号为空"),
		@ApiResponse(code=8002, message="账户类型为空"),
		@ApiResponse(code=7001, message="指定账户不存在"),
		@ApiResponse(code=7002, message="修改未能得到预期影响值(预期1)"),
		@ApiResponse(code=7003, message="修改时发生异常"),
		@ApiResponse(code=7004, message="7003~7998为修改时发生的其它错误"),
		@ApiResponse(code=7999, message="设置成功")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/edit/type")
	public MsgEmity editUserType(String sDbAndTable, String sId, String sType) {
		return guestService.editUserType(sDbAndTable, sId, sType);
	}

	/**
	 * 注册'来宾账户登录信息'
	 * @param sOwner 账户归属
	 * @param serverName 回调目标服务
	 * @param sInsideKey 请求密钥
	 * @param url 回调目标地址
	 * @return
	 */
	@ApiOperation(value="注册'来宾账户登录信息'", notes="分布式项目内部接口,客户端禁止使用")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sOwner", value="账户归属", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="serverName", value="回调目标服务", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sInsideKey", value="请求密钥", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="url", value="回调目标地址", dataType="String", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST, RequestMethod.GET}, value="/register")
	public MsgEmity registerService(String sOwner, String serverName,
			String sInsideKey, String url) {
		return GuestLoginLogServiceAspect.registerService(sOwner, serverName, sInsideKey, url);
	}
	
}
